﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using vudu.ClasesDominio;
using vudu.Datos.Fachada;

namespace vudu.Logica.Clases
{
    public class ControladorPensum
    {
        private Pensum _pensum;
        private List<Pensum> _listaPensum;

        public Pensum Pensum
        {
            get { return _pensum; }
            set { _pensum = value; }
        }

        public List<Pensum> ListaPensum
        {
            get { return _listaPensum; }
            set { _listaPensum = value; }
        }

        public ControladorPensum()
        {
            _pensum = new Pensum();

        }


        /// <summary>
        /// metodo que se encarga de agregar un objeto pensum al sistema
        /// para poder realziar la etapadearmar sus semestres
        /// </summary>
        /// <param name="p"></param>
        /// <returns>
        /// id del objeto pensum que se desea armar
        /// </returns>
        public int AgregarPensum(Pensum p)
        {
            return new EnlaceDatos().CrearPensum(p);
        }

        /// <summary>
        /// Metodo que retorna las materias pertenecientes a un pensum
        /// </summary>
        /// <param name="idPensum">id del pensum a buscar</param>
        /// <returns></returns>
        public List<Prelacion> ConsultarMateriasDePensum(int idPensum)
        {
            return new EnlaceDatos().ConsultarMateriasDePensum(idPensum);
        }

        /// <summary>
        /// Metodo que se encarga de obtener las prelaciones de una amteria determinada para dado pensum
        /// </summary>
        /// <param name="idPensum">id del pensum al que pertenece la amteria</param>
        /// <param name="idMateria">id de materiaal que pertenece la prelacion</param>
        /// <returns>lista d eamterias que prelan a esa materia</returns>
        public List<Materia> ConsultarPrelacionDeMateria(int idPensum, int idMateria)
        {
            return new EnlaceDatos().ConsultarPrelacionesDeMateria(idPensum, idMateria);
        }

        /// <summary>
        /// Metodo que retorna la lista de pensum archivados por escuela
        /// </summary>
        /// <param name="e">escibe el objeto escuela(q estalogeada) la cual pertenecen los pensums
        /// archivados a consultar</param>
        /// <returns>lista de pensums archivados</returns>
        public List<Pensum> ConsultarPensumsArchivados(Escuela e)
        {
            List<Pensum> listaP = new List<Pensum>();
            if (e != null)
            {
                EnlaceDatos fachada = new EnlaceDatos();
                //obtengo el id del objeto que recibo y en funcion a esto busco sus pensums
                listaP = fachada.ConsultarPensumArchivados(e.IdEscuela);
            }
            return listaP;
        }

        /// <summary>
        /// Metodo que retorna la lista de pensum desactivados por escuela
        /// los pensums desactivados son los pensums que creo la escuela mas no se han
        /// puesto en vigencia(asignado un periodo academico) y mucho menos han sido archivados
        /// </summary>
        /// <param name="e">escibe el objeto escuela(q estalogeada) la cual pertenecen los pensums
        /// archivados a consultar</param>
        /// <returns>lista de pensums desactivados</returns>
        public List<Pensum> ConsultarPensumsDesactivados(Escuela e)
        {
            List<Pensum> listaP = new List<Pensum>();
            if (e != null)
            {
                EnlaceDatos fachada = new EnlaceDatos();
                //obtengo el id del objeto que recibo y en funcion a esto busco sus pensums
                listaP = fachada.ConsultarPensumInactivos(e.IdEscuela);
            }
            return listaP;
        }

        /// <summary>
        /// MEtodo que se encara de agregar la materia con su respectivo numero de semestre en determinado pensum
        /// </summary>
        /// <param name="p">Pensum a insertar</param>
        /// <param name="m">semestre completo</param>
        /// <returns>true:biel, false:mal</returns>
        public bool AgregarMateriaEnPensum(Pensum p, List<Prelacion> sm)
        {
            bool resp = false;
            EnlaceDatos fachada = new EnlaceDatos();
            if ((p != null) && (sm != null))
            {
                foreach (Prelacion materiaSemestre in sm)
                {
                    Materia materia = materiaSemestre.MiMateriaPensum;
                    if(materia != null)
                        resp = fachada.AgregarMateriaEnPensum(p.IdPensum, materia.Codigo, materiaSemestre.SemestreMateriaPensum);
                }
                
            }
            return resp;
        }
        
        /// <summary>
        /// Consulta lasmaterias de un semestre dado
        /// </summary>
        /// <param name="p">Pensum al que pertenecen las materias</param>
        /// <param name="num">semestre que se desea consultar</param>
        /// <returns>lista de objetos prelaciones q encapsulan la materia y su numero de semestres</returns>
        public List<Prelacion> ConsultarMateriasPorSemestre(Pensum p, int num)
        {
            List<Prelacion> semestre = new List<Prelacion>();
           
            if ((p != null) && (num != 0))
            {
                EnlaceDatos fachada = new EnlaceDatos();
                semestre = fachada.ConsultarMateriasDePensumPorSemestre(p.IdPensum, num);
            }
            return semestre;
        }

        /// <summary>
        /// Consulta lasmaterias de un semestre dado
        /// </summary>
        /// <param name="p">Pensum al que pertenecen las materias</param>
        /// <param name="num">semestre que se desea consultar</param>
        /// <returns>lista de objetos prelaciones q encapsulan la materia y su numero de semestres</returns>
        public List<Prelacion> ConsultarMateriasDeSemestresInferiores(Pensum p, int num, Materia mat)
        {
            List<Prelacion> semestre = new List<Prelacion>();

            if ((p != null) && (num != 0) && (mat != null))
            {
                EnlaceDatos fachada = new EnlaceDatos();
                semestre = fachada.ConsultarMateriasDePensumDeSemestresInferiores(p.IdPensum, num, mat.Codigo);
            }
            return semestre;
        }

        /// <summary>
        /// Metodo que se encarga de agregar una lista d eamterias escogidas comoprelaciones para un determinado pensum
        /// </summary>
        /// <param name="materia">materia a la cual se desea prelar</param>
        /// <param name="prelaciones">prelaciones asignadas</param>
        /// <param name="pensum">pensum al cual pertenecen las materias</param>
        /// <returns>true: se agregaron
        /// false: no se agregaron</returns>
        public bool AgregarPrelacionesDeMateria(Materia materia, List<Materia> prelaciones, Pensum pensum)
        {
            bool resp = false;

            if ((materia != null) && (prelaciones != null) && (pensum != null))
            {
                foreach (Materia prelacion in prelaciones)
                {
                    if (prelacion != null)
                    {
                        EnlaceDatos fachada = new EnlaceDatos();
                        resp = fachada.InsertarPrelacionDeMateria(materia.Codigo, prelacion.Codigo, pensum.IdPensum);
                    }
                }
            }
            return resp;
        }

        /// <summary>
        /// Metodo que se encarga de eliminar una lista d eamterias escogidas comoprelaciones para un determinado pensum
        /// </summary>
        /// <param name="materia">materia a la cual se desea prelar</param>
        /// <param name="prelaciones">prelaciones asignadas</param>
        /// <param name="pensum">pensum al cual pertenecen las materias</param>
        /// <returns>true: se agregaron
        /// false: no se agregaron</returns>
        public bool EliminarPrelacionesDeMateria(Materia materia, List<Materia> prelaciones, Pensum pensum)
        {
            bool resp = false;

            if ((materia != null) && (prelaciones != null) && (pensum != null))
            {
                foreach (Materia prelacion in prelaciones)
                {
                    if (prelacion != null)
                    {
                        EnlaceDatos fachada = new EnlaceDatos();
                        resp = fachada.EliminarPrelacion(materia.Codigo, prelacion.Codigo, pensum.IdPensum);
                    }
                }
            }
            return resp;
        }

        /// <summary>
        /// metodo que se encarga de eliminaruna materia en dado pensum
        /// </summary>
        /// <param name="materia">materia a eliminar</param>
        /// <param name="pensum">pensum en el que esta</param>
        /// <returns>true: lo elimino; false: no lo elimino</returns>
        public bool EliminarMateriaPensum(List<Materia> materia, Pensum pensum)
        {
            bool resp = false;
            if (( materia != null ) && ( pensum != null ))
            {
                EnlaceDatos fachada = new EnlaceDatos();
                foreach (Materia materiaActual in materia)
                {
                    resp=fachada.EliminarMateriaPensum(materiaActual.Codigo,pensum.IdPensum);
                }
                return resp;
            }
            return resp;
        }

        /// <summary>
        /// LLamado a la fachada para eliminar un pensum
        /// </summary>
        /// <param name="idPensum">id del pensum a eliminar</param>
        /// <returns></returns>
        public bool EliminarPensum(int idPensum)
        {
            EnlaceDatos fachada = new EnlaceDatos();
            return fachada.eliminarPensum(idPensum);
        }

        /// <summary>
        /// LLamado a la fachada para consultar el pensum activo de una escuela
        /// </summary>
        /// <param name="idEscuela">id de la escuela</param>
        /// <returns></returns>
        public Pensum PensumActivoEscuela(int idEscuela)
        {
            EnlaceDatos fachada = new EnlaceDatos();
            return fachada.CosnultarPensumActivo(idEscuela);
        }

        /// <summary>
        /// llamado a la fachada para archivar un pensum
        /// </summary>
        /// <param name="idPensum">id del pensum a archivar</param>
        /// <returns></returns>
        public bool ArchivarPensum(int idPensum)
        {
            EnlaceDatos fachada = new EnlaceDatos();
            return fachada.ArchivarPensum(idPensum);
        }

        /// <summary>
        /// Llamado a la fachada para consultar el periodo academico actual
        /// </summary>
        /// <returns>id del periodo academico</returns>
        public int ConsultarPeriodoActual()
        {
            EnlaceDatos fachada = new EnlaceDatos();
            return fachada.ConsultarPeriodoActual();
        }

        /// <summary>
        /// llamado a la fachada para activar un pensum
        /// </summary>
        /// <param name="idPensum"> id del pesum para activar</param>
        /// <param name="idPeriodo">id del periodo academico donde se va activar el pensum</param>
        /// <returns></returns>
        public bool ActivarPensum(int idPensum, int idPeriodo)
        {
            EnlaceDatos fachada = new EnlaceDatos();
            return fachada.ActivarUnPensum(idPensum, idPeriodo);
        }

        public List<Materia> ConsultarMateriaEscuela(int idEscuela)
        {
            EnlaceDatos fachada = new EnlaceDatos();
            return fachada.ConsultarMateriaEscuela(idEscuela);
        }

        public List<SeccionMateria> ConsultarMateriaSeccion(int idMateria)
        {
            EnlaceDatos fachada = new EnlaceDatos();
            return fachada.ConsultarMateriaSeccion(idMateria);
        }

        public List<Estudiante> ConsultarEstudiantesSeccion(int idSeccion)
        {
            EnlaceDatos fachada = new EnlaceDatos();
            return fachada.ConsultarEstudiantesSeccionG3(idSeccion);
        }
    }
}